#include "LecteurSymbole.h"
#include <ctype.h>
#include <string.h>
#include <iostream>

using namespace std;

////////////////////////////////////////////////////////////////////////////////
LecteurSymbole::LecteurSymbole(string nomFich) :
	lc(nomFich), symCour("") {
	suivant(); // pour lire le premier symbole
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::suivant() {
	sauterSeparateurs();
	// on est maintenant positionne sur le premier caractère d'un symbole
	ligne=lc.getLigne();
	colonne=lc.getColonne();
	symCour=Symbole(motSuivant()); // on reconstruit symCour avec le nouveau mot lu
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::sauterSeparateurs() {
	while (lc.getCarCour()==' '  || 
		   lc.getCarCour()=='\t' || 
		   lc.getCarCour()=='\r' || 
		   lc.getCarCour()=='\n' ||
		   lc.getCarCour()=='#')
		if(lc.getCarCour()=='#')
			sauterCommentaires();
		else
			lc.suivant();
}

////////////////////////////////////////////////////////////////////////////////
string LecteurSymbole::motSuivant() {
	static string  s;
	s="";
	if (isdigit(lc.getCarCour()))
	{
		// c'est le début d'un entier
		do {
			s=s+lc.getCarCour();
			lc.suivant();
		} while (isdigit(lc.getCarCour()));
	}
	else if (isalpha(lc.getCarCour()))
	{
		// c'est le début d'un mot
		do {
			s=s+lc.getCarCour();
			lc.suivant();
		} while (isalpha(lc.getCarCour())  || 
				isdigit(lc.getCarCour()) || 
				lc.getCarCour()=='_');
	}
	else if (lc.getCarCour()!=EOF)
	// c'est un caractere special
	{
		s=lc.getCarCour();
		lc.suivant();
		if(s == ">")
		{
			if(lc.getCarCour() == '=')
			{
				s+=lc.getCarCour();
				lc.suivant();
			}
		}
		else if(s == "<")
		{
			if(lc.getCarCour() == '=')
			{
				s+=lc.getCarCour();
				lc.suivant();
			}
		}
		else if(s == "=")
		{
			if(lc.getCarCour() == '=')
			{
				s+=lc.getCarCour();
				lc.suivant();
			}
		}
		else if(s == "!")
		{
			if(lc.getCarCour() == '=')
			{
				s+=lc.getCarCour();
				lc.suivant();
			}
		}
		else if (s == "\"")
		{
			//debut d'une string
			while(lc.getCarCour()!='"' && lc.getCarCour()!='\n')
			{
				s=s+lc.getCarCour();
				lc.suivant();
			}
			if(lc.getCarCour()=='\n')
			{
				char tmp[100];
				sprintf(tmp, "Missing '\"' at the end of the line number : %i",lc.getLigne());
				string stmp = tmp;
				throw stmp;
			}
			else
				s=s+lc.getCarCour();
				lc.suivant();
		}
	}
	return s;
}

void LecteurSymbole::sauterCommentaires()
{
	do{
		lc.suivant();
	}while(lc.getCarCour()!='\n' && lc.getCarCour()!='\r');
	lc.suivant();
	
}